package com.rainbow.common.core.entity;

import com.alibaba.fastjson.annotation.JSONType;
import com.rainbow.common.core.error.CommonErrorDict;
import com.rainbow.common.core.error.GlobalErrorCode;
import com.rainbow.common.core.toolkit.MessageI18nUtil;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;

import java.io.Serializable;
/**
 * 响应数据
 * @author 傅为地
 */
@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = false)
@ApiModel("返回结果")
@JSONType(orders = {"code","message","data"})
public class Result<T> implements Serializable {
	private static final long serialVersionUID = 1L;
	@ApiModelProperty("返回状态码")
	private Integer code;
	@ApiModelProperty("返回消息体")
	private String message;
	@ApiModelProperty("数据内容")
	private T data;


	/**
	 * 服务器接到请求
	 * 业务处理时错误
	 * 自定义错误信息
	 * @param code 业务编码
	 * @param msg  业务消息
	 * @param <T> 泛型类型
	 * @return 返回消息体
	 */
	public static <T> Result<T> error(int code, String msg) {
		return error(code, msg, null);
	}

	/**
	 * 服务器接到请求
	 * 业务处理时错误
	 * 自定义错误信息
	 *
	 * @param dict 响应枚举
	 * @param <T> 泛型类型
	 * @return 返回消息体
	 */
	public static <T> Result<T> error(CommonErrorDict dict) {
		return error(dict, null);
	}

	/**
	 * 服务器接到请求
	 * 业务处理时错误
	 *
	 * @param data 响应体
	 * @param <T> 泛型类型
	 * @return 返回消息体
	 */
	public static <T> Result<T> error(T data) {
		return new Result<>(GlobalErrorCode.INTERNAL_SERVER_ERROR.code(), MessageI18nUtil.getMessage(GlobalErrorCode.INTERNAL_SERVER_ERROR.message()), data);
	}

	/**
	 * 服务器接到请求
	 * 业务处理时错误
	 *
	 * @param data 响应体
	 * @param code 业务编码
	 * @param msg  业务消息
	 * @param <T> 泛型类型
	 * @return 返回消息体
	 */
	public static <T> Result<T> error(int code, String msg, T data) {
		return new Result<>(code, MessageI18nUtil.getMessage(msg), data);
	}

	/**
	 * 服务器接到请求
	 * 业务处理时错误
	 * 自定义错误信息
	 * @param dict 响应枚举
	 * @param data 数据体
	 * @param <T> 泛型类型
	 * @return 返回泛型类型结果
	 */
	public static <T> Result<T> error(CommonErrorDict dict, T data) {
		return new Result<>(dict.code(), MessageI18nUtil.getMessage(dict.message()), data);
	}

	/**
	 * 服务器接到请求
	 * 业务处理时错误
	 * @param dict 字典枚举
	 * @param data 返回内容
	 * @param <T> 泛型类型
	 * @return 返回指定泛型类型结果
	 */
	public static <T> Result<T> fail(CommonErrorDict dict, T data) {
		return fail(dict.code(), dict.message(), data);
	}

	/**
	 * 服务器接到请求
	 * 业务处理时错误
	 * @param msg  消息题
	 * @param data 数据体
	 * @param <T>  返回内容
	 * @return 返回结果
	 */
	public static <T> Result<T> fail(String msg, T data) {
		return fail(GlobalErrorCode.INTERNAL_SERVER_ERROR.code(), msg, data);
	}

	/**
	 * 服务器接到请求
	 * 业务处理时错误
	 * @param code 返回码
	 * @param msg 返回消息体
	 * @param data 返回参数
	 * @param <T> 泛型类型
	 * @return 返回泛型结果
	 */
	public static <T> Result<T> fail(int code, String msg, T data) {
		return new Result<>(code, MessageI18nUtil.getMessage(msg), data);
	}

	/**
	 * 服务器接到请求
	 * 服务器处理成功
	 * @param data 响应体
	 * @param <T> 泛型类型
	 * @return 返回泛型类型消息体
	 */
	public static <T> Result<T> success(T data) {
		return new Result<>(GlobalErrorCode.SUCCESS.code(), MessageI18nUtil.getMessage(GlobalErrorCode.SUCCESS.message()), data);
	}

	/**
	 * 服务器接到请求
	 * 服务器处理成功
	 * @param msg 消息体
	 * @param data 响应体
	 * @param <T> 泛型类型
	 * @return 返回泛型类型消息
	 */
	public static <T> Result<T> success(String msg, T data) {
		return success(200, msg, data);
	}

	/**
	 * 服务器接到请求
	 * 服务器处理成功
	 * @param code 响应码
	 * @param msg 消息体
	 * @param data 响应体
	 * @param <T> 泛型类型
	 * @return 返回泛型类型消息体
	 */
	public static <T> Result<T> success(int code, String msg, T data) {
		return new Result<>(code, MessageI18nUtil.getMessage(msg), data);
	}

	/**
	 * 服务器接到请求
	 * 服务器处理成功
	 * @param dict 响应码
	 * @param data 响应体
	 * @param <T> 泛型类型
	 * @return 返回指定泛型结果
	 */
	public static <T> Result<T> success(CommonErrorDict dict, T data) {
		return new Result<>(dict.code(), MessageI18nUtil.getMessage(dict.message()), data);
	}


	/**
	 * 服务器接到请求
	 * 服务器处理成功,不需要翻译(国际化)
	 * @param data 响应体
	 * @param <T> 泛型类型
	 * @return 返回泛型类型消息体
	 */
	public static <T> Result<T> successNoTrans(String msg,T data) {
		return new Result<>(GlobalErrorCode.SUCCESS.code(), msg, data);
	}

	/**
	 * 服务器接到请求
	 * 服务器处理成功,不需要翻译(国际化)
	 * @param data 响应体
	 * @param <T> 泛型类型
	 * @return 返回泛型类型消息体
	 */
	public static <T> Result<T> successNoTrans(T data) {
		return new Result<>(GlobalErrorCode.SUCCESS.code(),GlobalErrorCode.SUCCESS.message(), data);
	}
}

